
package com.lzy.cloud.payment.component.pay;

import com.alipay.api.domain.OrderLogisticsInfo;
import com.lzy.cloud.payment.constants.BusinessStatus;
import com.lzy.cloud.payment.constants.CommonConstants;
import com.lzy.cloud.payment.dtos.pay.BasePayDTO;
import com.lzy.cloud.payment.dtos.pay.PayOrderParamsDTO;
import com.lzy.cloud.payment.dtos.payment.PayBillDto;
import com.lzy.cloud.payment.dtos.payment.PayInfoDetailDto;
import com.lzy.cloud.payment.dtos.payment.PayInfoDto;
import com.lzy.cloud.payment.remote.AccountApi;
import com.lzy.cloud.payment.remote.BaseApi;
import com.lzy.cloud.payment.remote.OrderApi;
import com.lzy.cloud.payment.remote.dtos.AccountWalletDto;
import com.lzy.cloud.payment.remote.dtos.AccountWalletInfoDto;
import com.lzy.cloud.payment.remote.dtos.BaseOrderDto;
import com.lzy.cloud.payment.remote.dtos.OrderExpenseItemDto;
import com.lzy.cloud.payment.remote.request.AccountWalletInfoRequest;
import com.lzy.cloud.payment.remote.request.BaseCouponRequest;
import com.lzy.cloud.payment.remote.request.OrderCouponLogRequest;
import com.lzy.cloud.payment.remote.request.OrderExpenseItemRequest;
import com.lzy.cloud.payment.remote.response.OrderCouponLogResponse;
import com.lzy.cloud.payment.service.PayBillService;
import com.lzy.cloud.payment.service.PayInfoDetailService;
import com.lzy.cloud.payment.service.PayInfoService;
import com.lzy.cloud.payment.utils.CommonsUtil;
import com.lzy.framework.core.ensure.Ensure;
import com.lzy.framework.core.utils.DozerUtils;
import com.lzy.framework.tools.commons.BigDecimalUtil;
import org.apache.shiro.authc.Account;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * @author stone
 * @version V1.0
 * @Title: PayTradeCommons.java
 * @Package com.lzy.payment.component.pay
 * @Description: 支付交易业务处理
 * @date 2017年6月26日 下午8:16:49
 */
@Component("payTradeCommons")
public class PayTradeCommons {
    private static final Logger logger = LoggerFactory.getLogger(PayTradeCommons.class);
    @Autowired
    private PayInfoService payInfoService;
    @Autowired
    private PayInfoDetailService payInfoDetailService;
    @Autowired
    private PayBillService payBillService;
    @Autowired
    private OrderApi orderApi;
    @Autowired
    private BaseApi baseApi;
    @Autowired
    private AccountApi accountApi;

    /**
     * 更新其他对外API接口
     *
     * @param bpd
     * @return
     */
    public boolean updateResult(BasePayDTO bpd) {
        switch (bpd.getType()) {
            case BusinessStatus.PayInfoType.pay:
                return pay(bpd);
            case BusinessStatus.PayInfoType.lbrecharge:
                return pay(bpd);
        }
        return false;
    }

    /**
     * 在线支付
     *
     * @param bpd
     * @return
     */
    boolean pay(BasePayDTO bpd) {
        PayOrderParamsDTO popDTO = new PayOrderParamsDTO();
        popDTO.setOrderId(bpd.getOut_trade_no());             //订单id
        popDTO.setPayName(CommonConstants.PayWay.getName(bpd.getWay()));    //支付名称
        popDTO.setStutas(CommonConstants.OrderPayStatus.YESPAY.getIndex()); //支付状态
        popDTO.setPayId(bpd.getWay());  //支付方式
        boolean updateOrderFlag = DozerUtils.map(orderApi.updatePayOrderStatus(popDTO).getResult(), Boolean.class);   //更新订单表支付状态
        return updateOrderFlag;
    }

//    /**
//     * 订单支付（冻结余额解冻，冻结卡券解冻）
//     * @return
//     */
//    Boolean thawPayment(BasePayDTO bpd,PayInfoDto payInfoDO){
//        //将订单中的冻结金额扣除
//        Boolean ok = false;
//        OrderExpenseItemRequest orderExpenseItemRequest = new OrderExpenseItemRequest();
//        orderExpenseItemRequest.setOrderId(bpd.getOut_trade_no());
//        orderExpenseItemRequest.setType(1);
//        List<OrderExpenseItemDto> orderExpenseItemDtoList = DozerUtils.maps((List) orderApi.queryList(orderExpenseItemRequest).getResult(), OrderExpenseItemDto.class);
//        OrderExpenseItemDto oeiDto = orderExpenseItemDtoList.get(0);
//        if (oeiDto != null && !BigDecimalUtil.isZeroOrNull(oeiDto.getAmount())) {
//            //根据订单id获取platformId
//            BaseOrderDto baseOrderDto = DozerUtils.map(orderApi.findOrderByOrderId(bpd.getOut_trade_no()), BaseOrderDto.class);
//            if (baseOrderDto != null) {
//                //获取该会员钱包中冻结金额数据
//                AccountWalletDto accountWalletDto = DozerUtils.map(accountApi.findByMemberIdAndPlatformId(bpd.getUserId(),baseOrderDto.getShopId()).getResult(), AccountWalletDto.class);
//                if (accountWalletDto != null && accountWalletDto.getId() != null) {
//                    AccountWalletInfoDto walletInfoDto = DozerUtils.map(accountApi.findByWalletId(accountWalletDto.getId()).getResult(), AccountWalletInfoDto.class);
//                    if (walletInfoDto != null && !BigDecimalUtil.isZeroOrNull(walletInfoDto.getBalance())
//                            && walletInfoDto.getBalance().compareTo(oeiDto.getAmount()) >= 0) {
//                        BigDecimal blockedMoney = walletInfoDto.getBalance().subtract(oeiDto.getAmount());
//                        //更新会员钱包中冻结金额数据
//                        AccountWalletInfoRequest awiDto = new AccountWalletInfoRequest();
//                        awiDto.setBalance(blockedMoney);
//                        awiDto.setWalletId(walletInfoDto.getWalletId());
//                        awiDto.setType(walletInfoDto.getType());
//                        awiDto.setCreateTime(walletInfoDto.getCreateTime());
//                        awiDto.setVersion(walletInfoDto.getVersion());
//                        ok = DozerUtils.map(accountApi.updateBlockedWallet(awiDto).getResult(), Boolean.class);
//                    }
//                }
//            }
//            //冻结金额扣除成功，添加交易日志
//            if (ok) {
//                bpd.setId(payInfoDO.getId());
//                //（余额支付）交易日志
//                payWalletBillInfo(oeiDto, bpd.getUserId());
//                //（在线支付）交易日志
//                payBillInfo(bpd);
//            }
//        }
//        //将订单中的卡券解锁定，并将状态更改为已使用，并添加卡券流向记录
//        //根据会员id和订单id找到锁定的卡券id列表
//        OrderCouponLogRequest orderCouponLogRequest = new OrderCouponLogRequest();
//        orderCouponLogRequest.setMemberId(bpd.getUserId());
//        orderCouponLogRequest.setOrderId(bpd.getOut_trade_no());
//        orderCouponLogRequest.setType(CommonConstants.OrderCouponLogType.LOCK.getCode());
//        List<OrderCouponLogResponse> orderCouponLogResponseList = DozerUtils.maps((List) orderApi.selectList(orderCouponLogRequest).getResult(), OrderCouponLogResponse.class);
//        if (orderCouponLogResponseList != null && orderCouponLogResponseList.size() > 0) {
//            String couponIds = "";
//            for (OrderCouponLogResponse oclResponse : orderCouponLogResponseList) {
//                if (oclResponse != null && oclResponse.getCouponId() != null) {
//                    BaseCouponRequest baseCouponRequest = new BaseCouponRequest();
//                    baseCouponRequest.setId(oclResponse.getCouponId());
//                    baseCouponRequest.setLocked(false);
//                    baseCouponRequest.setStatus(3);
//                    baseApi.updateByKey(baseCouponRequest);
//                    couponIds = couponIds + oclResponse.getCouponId() + ",";
//                }
//            }
//            //批量修改订单中券流向记录
//            OrderCouponLogRequest oclRequest = new OrderCouponLogRequest();
//            oclRequest.setMemberId(bpd.getUserId());
//            oclRequest.setOrderId(bpd.getOut_trade_no());
//            orderApi.updateManyLog(oclRequest, couponIds);
//        }
//        return true;
//    }


    /**
     * 支付交易流水数据
     *
     * @param payInfoDO
     * @param bpd
     */
    public void payInfo(PayInfoDto payInfoDO, BasePayDTO bpd) {
        Map<String, Object> saveData = PayInfoDto.payInfo(bpd);
        Ensure.that(CommonsUtil.isEmptyMap(saveData)).isFalse("09000026"); //支付表，支付明细表，账单表封装实体异常   --
        PayInfoDto piDO = (PayInfoDto) saveData.get("payInfoDto");
        PayInfoDetailDto payInfoDetailDO = (PayInfoDetailDto) saveData.get("payInfoDetailDto");
        piDO.setId(payInfoDO.getId());
        boolean payId = payInfoService.updatePayInfo(piDO);        //支付表
        Ensure.that(payId).isTrue("09000027");
        payInfoDetailDO.setOpenid(payInfoDO.getId() + "");
        boolean payDflag = payInfoDetailService.createPayInfoDetail(payInfoDetailDO);  //支付明细表
        Ensure.that(payDflag).isTrue("09000028");
    }

    /**
     * 交易日志数据（在线支付）
     *
     * @param bpd
     * @param bpd
     */
    public void payBillInfo(BasePayDTO bpd) {
        Map<String, Object> saveData = PayBillDto.pay(bpd);
        Ensure.that(CommonsUtil.isEmptyMap(saveData)).isFalse("09000026"); //实体封装异常
        PayBillDto payBillDto = (PayBillDto) saveData.get("payBillDto");
        //是否需要获取用户的身份（商户还是用户）


        payBillDto.setOrderId(bpd.getId().toString());
        payBillDto.setType(bpd.getType());
        boolean flag = payBillService.createPayBill(payBillDto);    //支付账单表
        Ensure.that(flag).isTrue("09000029");
    }

    /**
     * 交易日志数据（余额支付）
     *
     * @param orderExpenseItemDto
     */
    public void payWalletBillInfo(OrderExpenseItemDto orderExpenseItemDto,Long memberId) {
        PayBillDto payBillDto = new PayBillDto();
        payBillDto.setOrderId(orderExpenseItemDto.getOrderId());
        payBillDto.setType(18);
        payBillDto.setAmount(orderExpenseItemDto.getAmount());
        payBillDto.setDemo("支付方式：余额支付");
        payBillDto.setRole(1);
        payBillDto.setMemberId(memberId);
        boolean flag = payBillService.createPayBill(payBillDto);//支付账单表
        Ensure.that(flag).isTrue("09000029");
    }
}
